# app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
import os  # 用于动态生成SECRET_KEY
from datetime import timedelta  # 会话内有效期

# 初始化扩展
db = SQLAlchemy()
login_manager = LoginManager()
login_manager.login_view = 'auth.login'  # 未登录时跳转登录页
login_manager.login_message = '请先登录以访问该页面'


def create_app(config_name: str = "dev") -> Flask:
    app = Flask(__name__)

    # ========== 关键配置：会话内有效，跨重启失效 ==========
    # 1. 动态生成SECRET_KEY（每次重启Flask变，跨重启Session失效）
    app.config['SECRET_KEY'] = os.urandom(24)
    # 2. 会话内保留登录状态（例如30分钟，足够操作）
    app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(minutes=30)
    app.config['SESSION_PERMANENT'] = True  # 会话内持久化
    # 3. Cookie仅在当前浏览器会话有效（关闭浏览器失效，可选）
    app.config['SESSION_COOKIE_EXPIRES'] = None  # 随浏览器会话结束而失效
    app.config['SESSION_COOKIE_HTTPONLY'] = True  # 安全加固

    # 数据库配置
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./test.db'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config['DEBUG'] = True

    # 初始化扩展
    db.init_app(app)
    login_manager.init_app(app)

    # 注册用户加载回调
    @login_manager.user_loader
    def load_user(user_id):
        from app.models.user import User
        return User.query.get(int(user_id))

    # 初始化用户命令（保留）
    @app.cli.command("init-user")
    def init_user():
        with app.app_context():
            from app.models.user import User
            db.create_all()
            try:
                user = User(username="周佳伟", email="zhou@example.com")
                user.set_password("123456")
                db.session.add(user)
                db.session.commit()
                print("✅ 用户创建成功：周佳伟/123456")
            except Exception as e:
                if "UNIQUE constraint failed" in str(e):
                    print("⚠️ 用户已存在")
                else:
                    print(f"❌ 错误：{e}")

    # 注册蓝图
    from app.routes import main_bp, auth_bp
    app.register_blueprint(main_bp)
    app.register_blueprint(auth_bp, url_prefix="/auth")

    return app